package destiny.预测;

import destiny.干支;

public class 流年行运排盘 extends 四柱排盘 {

	/**
	 * 胡子系统假设：
	 * 
	 * 流年大运任意贴
	 * 
	 * 大运优先、流年次之
	 * 
	 * 太岁领大运
	 */
	public static 流年行运排盘 运盘(干支[] 柱, int 大运经年) {
		流年行运排盘 pan = new 流年行运排盘(柱);
		pan.柱数[Consts.流年行运运序].干数().setWeight(
				Consts.大运流年干支权和 - (大运经年 + 1) * Consts.大运生发);
		pan.柱数[Consts.流年行运运序].支数().setWeight((大运经年 + 1) * Consts.大运生发);

		pan.柱数[Consts.流年行运流年序].干数().setWeight(Consts.大运流年干支权和 - Consts.太岁权重);
		pan.柱数[Consts.流年行运流年序].支数().setWeight(Consts.太岁权重); // 太岁

		return pan;
	}

	/**
	 * 运与命先论局论生克，流年后与命运论局论生克，命与运、流年与命运皆以贴柱论
	 */
	public 流年行运排盘(干支[] 柱) {
		super(柱, Consts.流年行运年序, Consts.流年行运月序, Consts.流年行运日序, Consts.流年行运时序);
	}

	/**************************** 天干 ************************************************/

	/**
	 * 大运、流年可与日元论合（胡子系统）
	 */
	@Override
	protected void 天干五合() {
		// 四柱
		super.天干五合();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			天干五合(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			天干五合(Consts.流年行运流年序, i);
		}
		// 流年-运
		天干五合(Consts.流年行运运序, Consts.流年行运流年序);
	}

	/**************************** 地支 ************************************************/

	/**
	 * 大运、流年任意冲（胡子系统）
	 */
	@Override
	protected void 地支冲() {
		// 四柱
		super.地支冲();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			地支冲(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			地支冲(Consts.流年行运流年序, i);
		}
		// 流年-运
		地支冲(Consts.流年行运运序, Consts.流年行运流年序);
	}

	/**
	 * 旺支半合紧贴但遇旺支紧贴而冲 ，以冲论。
	 * 
	 * 半合紧贴遇非旺支冲，冲不动，以半合论。
	 * 
	 * 半合中隔冲支，以冲论。
	 */

	@Override
	protected void 生地半合() {
		// 四柱
		super.生地半合();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			生地半合(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			生地半合(Consts.流年行运流年序, i);
		}
		// 流年-运
		生地半合(Consts.流年行运运序, Consts.流年行运流年序);
	}

	@Override
	protected void 墓地半合() {
		// 四柱
		super.墓地半合();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			墓地半合(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			墓地半合(Consts.流年行运流年序, i);
		}
		// 流年-运
		墓地半合(Consts.流年行运运序, Consts.流年行运流年序);
	}

	@Override
	protected void 地支六合() {
		// 四柱
		super.地支六合();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			地支六合(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			地支六合(Consts.流年行运流年序, i);
		}
		// 流年-运
		地支六合(Consts.流年行运运序, Consts.流年行运流年序);
	}

	@Override
	protected void 非旺半合() {
		// 四柱
		super.非旺半合();
		// 命运
		for (int i = 年序; i <= 时序; ++i) {
			非旺半合(Consts.流年行运运序, i);
		}
		// 流年-命
		for (int i = 年序; i <= 时序; ++i) {
			非旺半合(Consts.流年行运流年序, i);
		}
		// 流年-运
		非旺半合(Consts.流年行运运序, Consts.流年行运流年序);
	}

	/**************************** 合化 ************************************************/

	/**
	 * 流年大运为合化引
	 */

	/**************************** 生克 ************************************************/
	@Override
	protected void 干支生克() {
		super.干支生克();

		/**
		 * 大运流年对四柱以贴柱论 ，流年地支为太岁，当天干隔柱论
		 * 
		 * 大运与四柱论生克，然后流年与四柱大运论生克，流年大运最后论生克，不影响命局
		 */
		/*
		 * 直坐干支已论
		 */

		干数 x = 柱数[Consts.流年行运运序].干数(), y = 柱数[Consts.流年行运流年序].干数(), z;

		/*
		 * 天干生克
		 */
		for (int i = 年序; i <= 时序; ++i) {
			z = 柱数[i].干数();
			if (干数.生克(x, z)) {
				if (Consts._DEBUG) {
					System.out.println(String.format("\t%s干 : %s \t- %s干 : %s",
							柱名(Consts.流年行运运序), x._DEBUG(), 柱名(i), z._DEBUG()));
				}
			}
		}
		/*
		 * 干支生克
		 */
		for (int i = 年序; i <= 时序; ++i) {
			干支生克(i, Consts.流年行运运序, Consts.隔柱衰减);
			干支生克(Consts.流年行运运序, i, Consts.隔柱衰减);
		}

		/*
		 * 天干生克
		 */
		for (int i = 年序; i <= 时序; ++i) {
			z = 柱数[i].干数();
			if (干数.生克(y, z)) {
				if (Consts._DEBUG) {
					System.out.println(String.format("\t%s干 : %s \t- %s干 : %s",
							柱名(Consts.流年行运流年序), y._DEBUG(), 柱名(i), z._DEBUG()));
				}
			}
		}
		/*
		 * 干支生克
		 */
		for (int i = 年序; i <= 时序; ++i) {
			干支生克(i, Consts.流年行运流年序, Consts.隔柱衰减);
			干支生克(Consts.流年行运流年序, i, Consts.隔柱衰减);
		}

		if (干数.生克(x, y)) {
			if (Consts._DEBUG) {
				System.out.println(String.format("\t%s干 : %s \t- %s干 : %s",
						柱名(Consts.流年行运运序), x._DEBUG(), 柱名(Consts.流年行运流年序),
						y._DEBUG()));
			}
		}
		干支生克(Consts.流年行运运序, Consts.流年行运流年序, Consts.隔柱衰减);
		干支生克(Consts.流年行运流年序, Consts.流年行运运序, Consts.隔柱衰减);
	}

	@Override
	public String 柱名(int i) {
		return 柱名2(i);
	}

	public static String 柱名2(int i) {
		switch (i) {
		case Consts.流年行运运序:
			return "运";
		case Consts.流年行运流年序:
			return "流年";
		default:
			return 四柱排盘.柱名2(i - Consts.流年行运年序);
		}
	}

	public static String 宫名2(int i, boolean 干, boolean 乾造) {
		return 四柱排盘.宫名2(i - Consts.流年行运年序, 干, 乾造);
	}
}
